﻿#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
//****************************************************************************************1 联合体

//**********************1.1 联合体类型的声明

//联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫：共⽤体


//**********************1.2 联合体的特点

//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	union Un un = { 0 };
//	printf("%zd\n", sizeof(union Un));
//	printf("%p\n", &un);//0116FCD4
//	printf("%p\n", &(un.c));//0116FCD4
//	printf("%p\n", &(un.i));//0116FCD4
//
//	return 0;
//}

//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	union Un un = { 0 };
//	un.i = 0x11223344;
//	un.c = 0x55;
//	//调试
//
//
//	return 0;
//}
//**********************1.3 相同成员的结构体和联合体对⽐

//struct S
//{
//	char c;
//	int i;
//};
//
//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(struct S));//8
//	printf("%zd\n", sizeof(union Un));//4----联合体中，编译器只为最大的成员分配足够的内存空间
//	return 0;
//}

//**********************1.4 联合体⼤⼩的计算

//union Un1
//{
//	char c[5];
//	int i;
//};
//union Un2
//{
//	short c[7];
//	int i;
//};
//int main()
//{
//	//下⾯输出的结果是什么？
//	printf("%d\n", sizeof(union Un1));//8
//	printf("%d\n", sizeof(union Un2));//16
//
//	//注意
//	//1.联合体的大小至少是最大成员数的大小
//	//2.当最大成员大小不是最大对齐数的整数倍时，要对齐到最大对齐数的整数倍
//	return 0;
//}

//使用联合体可以节省空间
/*
我们要搞⼀个活动，要上线⼀个礼品兑换单，礼品兑换单中有三种商品：图书、杯⼦、衬衫。
每⼀种商品都有：库存量、价格、商品类型和商品类型相关的其他信息。
图书：书名、作者、⻚数
杯⼦：设计
衬衫：设计、可选颜⾊、可选尺⼨
*/

//1.首先，可以直接地使用结构体

//struct gift_list
//{
//	//公共属性
//	int stock_number;//库存量
//	double price;//定价
//	int item_type;//商品类型
//
//	//特殊属性
//	char title[20];//书名
//	char author[20];//作者
//	int num_pages;//页数
//
//	char design[30];//设计
//	char colors[10];//颜色
//	double sizes;//尺寸
//};
//
////但是，考虑到特殊属性只用一次，可以用联合体来处理特殊属性
//
//struct gift_list
//{
//	//公共属性
//	int stock_number;//库存量
//	double price;//定价
//	int item_type;//商品类型
//
//	//特殊属性
//	//因为特殊属性只使用一次，这里的联合体和结构体都是匿名的，读取时，可以用对应的名字进行访问
//	union 
//	{
//		struct
//		{
//			char title[20];//书名
//			char author[20];//作者
//			int num_pages;//页数
//		}book;
//		struct 
//		{
//			char design[30];//设计
//		}mug;
//		struct 
//		{
//			char design[30];//设计
//			char colors[10];//颜色
//			double sizes;//尺寸
//		}shirt;
//	}item;
//};


//**********************1.5 联合的⼀个练习

//写⼀个程序，判断当前机器是⼤端？还是⼩端
//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	union Un un = { 0 };
//	un.i = 1;
//	if (un.c == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大段\n");
//	}
//	return 0;
//}


//****************************************************************************************2 枚举类型

//**********************2.1 枚举类型的声明

//enum Sex
//{
//	MALE,//枚举常量
//	FEMALE,
//	SECRET
//};
//
//int main()
//{
//	enum Sex sex1 = MALE;
//	enum Sex sex2 = FEMALE;
//	printf("%d\n", MALE);
//	printf("%d\n", FEMALE);
//	printf("%d\n", SECRET);
//	//1.枚举常量遵循作用域规则是有值的，默认从0开始，依次递增1
//	//2,在声明枚举类型时，枚举常量也可以赋初值(整型常量表达式)，在此基础上，依次递增1
//
//	return 0;
//}

//**********************2.2 枚举类型的优点
/*
	1.增加代码的可读性和可维护性
	2.和#define定义的标识符比较，枚举有类型检查，更加严谨
	3.便于调试，预处理阶段会删除#define定义的符号
	4.使用方便，一次可以定义多个常量
	5.枚举常量遵循作用域规则，枚举声明在函数内时，只能在函数内使用
*/

//**********************2.3 枚举类型的使用

//enum Sex
//{
//	MALE,//枚举常量
//	FEMALE = 10,
//	SECRET
//};
//
////在C语言中，可以用整数给枚举变量赋值
/////但是在C++中不行，因为C++的类型检查更加严格
//
//int main()
//{
//	printf("%d\n", MALE);//0
//	printf("%d\n", FEMALE);//10
//	printf("%d\n", SECRET);//11
//	return 0;
//}


//写一个计算器----实现整数的加减乘除

//void menu()
//{
//	printf("**************************************\n");
//	printf("**********  1. add   2. sub  *********\n");
//	printf("**********  3. mul   4. div  *********\n");
//	printf("**********  0. exit          *********\n");
//	printf("**************************************\n");
//}
//
// 
//enum Option
//{
//	EXIT,
//	ADD,
//	SUB,
//	MUL,
//	DIV
//};
//
//
//int main()
//{
//	int input = 0;
//	do
//	{
//		menu();
//		scanf("%d\n", &input);
//		switch (input)
//		{//这样增加了代码的可读性 
//		case ADD://加
//			add();
//			break;
//		case SUB://减
//			sub();
//			break;
//		case MUL://乘
//			mul();
//			break;
//		case DIV://除
//			div();
//			break;
//		case EXIT://退出
//			printf("退出\n");
//			break;
//		default:
//			printf("选择错误，请重新选择！\n");
//			break;
//		}
//
//	} while (input);
//	return 0;
//}



